package com.hua.util;

import android.annotation.SuppressLint;
import android.text.TextUtils;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 类名: CommDateTimeUtil
 * 作者: 蒋剑华
 * 创建时间: 2025/11/7 16:02
 * 类描述：日期 和 时间 操作工具类
 */
public enum CommDateTimeUtil {

    INSTANCE;

    //日期 + 时间 格式
    @SuppressLint("SimpleDateFormat")
    private final SimpleDateFormat dateAndTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //日期  格式
    @SuppressLint("SimpleDateFormat")
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    //时间  格式
    @SuppressLint("SimpleDateFormat")
    private final SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");

    /**
     * 方法名：getNowDateAndTime
     * 作者：蒋剑华
     * 创建时间：2025/11/7 16:35
     * 参数描述：无参数
     * 方法描述：获取当前时间 类型为 1999-01-01 00:00:00
     * 返回类型：返回时间String字符串
     */
    public String getNowDateAndTime() {
        return dateAndTimeFormat.format(new Date());
    }

    /**
     * 方法名：getNowDate
     * 作者：蒋剑华
     * 创建时间：2025/11/7 16:36
     * 参数描述：无参数
     * 方法描述：获取当前日期 类型为 1999-01-01
     * 返回类型：返回日期String字符串
     */
    public String getNowDate() {
        return dateFormat.format(new Date());
    }

    /**
     * 方法名：compare
     * 作者：蒋剑华
     * 创建时间：2025/11/7 17:19
     * 参数描述：
     * @param tarDate 你想要和当前时间对比的目标时间
     * 方法描述：用一个目标时间和当前时间对比
     * 返回类型：true: 目标时间大于当前时间  false: 目标时间小于当前时间
     */
    public Boolean compare(String tarDate) throws ParseException, IOException {
        if (tarDate == null || TextUtils.isEmpty(tarDate)) {
            throw new IOException("目标时间不得为空");
        }
        Date parseTarDate = dateAndTimeFormat.parse(tarDate);
        assert parseTarDate != null; //断言 假设对象不为空
        return parseTarDate.compareTo(dateAndTimeFormat.parse(getNowDateAndTime())) > 0;
    }

    /**
     * 方法名：compare
     * 作者：蒋剑华
     * 创建时间：2025/11/7 17:45
     * 参数描述：
     * @param tarDate Date类型 同上
     * 方法描述：头上
     * 返回类型：同上
     */
    public Boolean compare(Date tarDate) throws IOException {
        if (tarDate == null) {
            throw new IOException("目标时间不得为空");
        }
        return tarDate.compareTo(new Date()) > 0;
    }

    /**
     * 方法名：compare
     * 作者：蒋剑华
     * 创建时间：2025/11/7 17:24
     * 参数描述：
     *  @param tarDate1 比较的第一个时间
     *  @param tarDate2 比较的第二个时间
     * 方法描述：传入两个时间，对比他们两个的大小
     * 返回类型：true: tarDate1 大  false: tarDate2 小
     */
    public Boolean compare(Date tarDate1, Date tarDate2) throws IOException {
        if (tarDate1 == null || tarDate2 == null) {
            throw new IOException("传入的两个时间都不得为空");
        }
        return tarDate1.compareTo(tarDate2) > 0;
    }

    /**
     * 方法名：compare
     * 作者：蒋剑华
     * 创建时间：2025/11/7 17:47
     * 参数描述：
     *  @param tarDate1 比较的第一个时间
     *  @param tarDate2 比较的第二个时间
     * 方法描述：传入两个时间，对比他们两个的大小
     * 返回类型：true: tarDate1 大  false: tarDate2 小
     */
    public Boolean compare(String tarDate1, String tarDate2) throws IOException {
        if ((tarDate1 == null || TextUtils.isEmpty(tarDate1)) || (tarDate2 == null || TextUtils.isEmpty(tarDate2))) {
            throw new IOException("传入的两个时间都不得为空");
        }
        return tarDate1.compareTo(tarDate2) > 0;
    }

    /**
     * 方法名：getMaxDate
     * 作者：蒋剑华
     * 创建时间：2025/11/7 17:43
     * 参数描述：
     * @param dates 一个可变长度类型，可以传多个date对象进来对比
     * 方法描述：传如多个时间对象，最后拿出一个最大的对象
     * 返回类型：Date返回一个日期对象
     */
    public Date getMaxDate(Date... dates) throws ParseException {
        Date dateFlag = null;


        for (Date date : dates) {
            if (dateFlag == null) {
                dateFlag = date;
            }
            if (date.compareTo(dateFlag) > 0) {
                dateFlag = date;
            }
        }

        return dateFlag;
    }

    /**
     * 方法名：getMaxDate
     * 作者：蒋剑华
     * 创建时间：2025/11/7 17:53
     * 参数描述：
     * @param dates 一个可变长度类型，可以传多个时间String对象进来对比
     * 方法描述：传如多个时间对象，最后拿出一个最大的对象
     * 返回类型：String 返回一个时间字符串
     */
    public String getMaxDate(String... dates) throws ParseException {
        Date dateFlag = null;

        for (String date : dates) {
            if (dateFlag == null) {
                dateFlag = dateAndTimeFormat.parse(date);
            }
            if (dateAndTimeFormat.parse(date).compareTo(dateFlag) > 0) {
                dateFlag = dateAndTimeFormat.parse(date);
            }
        }

        return dateAndTimeFormat.format(dateFlag);
    }

    /**
     * 方法名：getMaxDate
     * 作者：蒋剑华
     * 创建时间：2025/11/7 17:57
     * 参数描述：传入一个String时间列表
     * 方法描述：同上
     * 返回类型：同上
     */
    public String getMaxDate(List<String> list) throws ParseException {
        Date dateFlag = null;

        for (String bean : list) {
            if (dateFlag == null) {
                dateFlag = dateAndTimeFormat.parse(bean);
            }
            if (dateAndTimeFormat.parse(bean).compareTo(dateFlag) > 0) {
                dateFlag = dateAndTimeFormat.parse(bean);
            }
        }
        return dateAndTimeFormat.format(dateFlag);
    }


}
